home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / fsw / zm302 / zm302_s.lzh / MPSRC045.LZH / P8EMU.HAS < prev   
Text File  |  1996-11-22  |  12KB  |  507 lines

  1.         .include    doscall.mac
  2.         .include    iocscall.mac
  3.  
  4. *---------------------------------------------------------------
  5. *          定数定義
  6. *---------------------------------------------------------------
  7.  
  8. TAB        equ        $09
  9. CR        equ        $0d
  10. LF        equ        $0a
  11. EOF        equ        $1a
  12.  
  13. *▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽
  14. *
  15. *        常駐部分データ
  16. *
  17. *△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△
  18.  
  19.         .align        4
  20.  
  21.  
  22. p8w:
  23. header:        .dc.b        'P8EmUWAC'    * 常駐判定用ヘッダ
  24. trap2_vec_buff:    .ds.l        1        * TRAP #2 ベクタ保存
  25. trap2_nest:    .dc.w        -1        * TRAP #2 多重呼出回数
  26. before_PCM:    .ds.w        16        * 前のPCM登録種類
  27.  
  28. p8emu_lock:    .ds.b        1        * 占有フラグ
  29. lockmode:    .ds.b        1        * 常駐解除チェックのモード
  30. emumode:    .ds.b        1        * チャンネルエミュレーションのモード
  31.  
  32.  
  33.  
  34. *▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽
  35. *
  36. *        ファンクションコール TRAP #2 処理
  37. *
  38. *△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△
  39.         .even
  40.         .dc.b        'PCM8/048'
  41.  
  42. p8emu_trap2:
  43.         addi.w        #1,trap2_nest
  44.         bgt        trap2_nested        * trap#2 処理中に再び呼び出された
  45.         movem.l        d1-d7/a0-a6,-(sp)
  46.  
  47.         lea.l        p8w(pc),a6        * a6.l = ワーク先頭アドレス
  48.  
  49.         cmpi.w        #$01FE,d0        * 占有
  50.         bne        @f
  51.         pea.l        trap2_ret(pc)
  52.         bra        func_01FE
  53. @@:        cmpi.w        #$01FF,d0        * 占有解除
  54.         bne        @f
  55.         pea.l        trap2_ret(pc)
  56.         bra        func_01FF
  57.  
  58. @@:        cmpi.w        #$0000+$0010,d0
  59.         bcc        func_error
  60.  
  61. normal_func:    move.b        d0,d7            * d7.w = チャンネル番号
  62.         andi.w        #$000f,d7
  63.  
  64.         sub.b        d7,d0            * 下位4bit 殺す
  65.         add.w        d0,d0
  66.         add.w        d0,d0            * d0.w = 機能番号*4
  67.         tst.b        emumode-p8w(a6)
  68.         bne        1f
  69.         lea.l        trap2_jmp_tbl0(pc),a0
  70.         bra        2f
  71. 1:        lea.l        trap2_jmp_tbl1(pc),a0
  72.  
  73. 2:        move.l        (a0,d0.w),a0
  74.         pea.l        trap2_ret(pc)
  75.         jmp        (a0)            * 各ファンクションへ
  76.  
  77. trap2_jmp_tbl0:
  78.         .dc.l        func_m_000x
  79. trap2_jmp_tbl1:
  80.         .dc.l        func_e_000x
  81.  
  82. reserved:
  83. func_error:    moveq.l        #-1,d0
  84. trap2_ret:    movem.l        (sp)+,d1-d7/a0-a6
  85. trap2_nested:    sub.w        #1,trap2_nest
  86.         rte
  87.  
  88.  
  89. *=======================================================
  90. *    機能コード $000x のエミュレーション(演奏チャンネル版)
  91. *=======================================================
  92.  
  93. panhen:        .dc.b        64,0,127,64
  94.  
  95. func_m_000x:
  96.         tst.l        d2
  97.         bne        @f
  98.  
  99.         move.w        d7,d0
  100.         addi.w        #$0100,d0
  101.         trap        #1            * キーオフ
  102.         rts
  103.  
  104. @@:        move.l        d1,d5
  105.         cmpi.b        #$ff,d5            * PANの設定
  106.         beq        @f
  107.         andi.w        #$0003,d1
  108.         move.w        d7,d0
  109.         addi.w        #$0600,d0
  110.         trap        #1            * MPCMのPAN設定
  111.  
  112. @@:        lsr.w        #8,d5            * 周波数の設定
  113.         cmpi.b        #$ff,d5
  114.         beq        4f
  115.         cmpi.b        #$04+1,d5
  116.         bcc        1f
  117.         move.w        d5,d1            * ADPCMの場合
  118.         moveq.l        #-1,d6
  119.         bra        3f
  120.  
  121. 1:        bne        2f
  122.         moveq.l        #1,d6            * 16bitPCMの場合
  123.         moveq.l        #4,d1
  124.         bra        3f
  125.  
  126. 2:        moveq.l        #2,d6            * 8bitPCMの場合
  127.         moveq.l        #4,d1
  128.  
  129. 3:        move.w        d7,d0
  130.         add.w        d0,d0
  131.         move.w        d6,before_PCM-p8w(a6,d0.w)    * PCMの種類保存
  132.         move.w        d7,d0
  133.         addi.w        #$0300,d0
  134.         trap        #1            * MPCMの周波数設定
  135.         bra        @f
  136.  
  137. 4:        move.w        d7,d0
  138.         add.w        d0,d0
  139.         move.w        before_PCM-p8w(a6,d0.w),d6    * 前のを使う
  140.  
  141. @@:        swap.w        d5            * 音量の設定
  142.         cmpi.b        #$ff,d5
  143.         beq        @f
  144.         lsl.w        #3,d5
  145.         move.w        d5,d1
  146. *        move.w        #$40,d1
  147.         move.w        d7,d0
  148.         addi.w        #$0500,d0
  149.         trap        #1            * MPCMの音量設定
  150.  
  151. @@:
  152.         move.w        dummy_key(pc),d1
  153.         add.w        #64*64,d1
  154.         cmp.w        #$1fc0+1,d1
  155.         bcs        1f
  156.         moveq.l        #0,d1
  157. 1:        move.w        d1,dummy_key
  158.         move.w        d1,d0
  159.         lsr.w        #6,d0
  160.         move.b        d0,func02xx_work+1    * オリジナルノートのローテーション
  161.  
  162.         move.w        d7,d0
  163.         addi.w        #$0400,d0
  164.         trap        #1            * 音程設定
  165.  
  166.         move.w        d7,d0
  167.         addi.w        #$0200,d0
  168.         move.l        a1,func02xx_work+4
  169.         lea.l        func02xx_work(pc),a1
  170.         subq.b        #1,d6            * PCM種類
  171.         bmi        @f
  172.         addq.b        #1,d6
  173. @@:        move.b        d6,(a1)
  174.         move.l        d2,8(a1)        * PCM長さ
  175.  
  176.         subq.l        #1,d2
  177.         move.l        d2,16(a1)        * PCMループ終点
  178.  
  179.         trap        #1            * PCMデータの登録
  180.  
  181.         move.w        d7,d0
  182.         trap        #1            * KEY_ON
  183.  
  184.         rts
  185.  
  186. func02xx_work:    .dc.b        0            * PCM種類
  187.         .dc.b        -1            * オリジナルノート
  188.         .dc.w        0            * dummy
  189.         .dc.l        0            * アドレス
  190.         .dc.l        0            * 長さ
  191.         .dc.l        0            * ループ開始
  192.         .dc.l        0            * ループ終了
  193.         .dc.l        1            * ループ回数
  194.  
  195. dummy_key:    .dc.w        $0000
  196.  
  197. *=======================================================
  198. *    機能コード $000x のエミュレーション(効果音チャンネル版)
  199. *=======================================================
  200.  
  201. func_e_000x:
  202.         tst.l        d2
  203.         beq        func_stop_eff_emu
  204.         bpl        @f
  205.         move.l        #-1,d0
  206.         rts
  207.  
  208. @@:        lea.l        fe_pan(pc),a0
  209.         ori.l        #$ff000000,d1            * default=ADPCM
  210.         move.w        d1,d0
  211.  
  212.         cmpi.b        #$ff,d0                * pan check
  213.         bne        @f
  214.         move.b        fe_pan-fe_pan(a0,d7.w),d1
  215. @@:        move.b        d1,fe_pan-fe_pan(a0,d7.w)
  216.  
  217.         lsr.w        #8,d0                * frq check
  218.         cmpi.b        #$ff,d0
  219.         beq        1f
  220.         cmpi.b        #$04+1,d0
  221.         bcs        2f
  222.         andi.l        #$0000000f,d0
  223.         subq.l        #4,d0
  224.         ror.l        #8,d0
  225.         andi.l        #$00ffffff,d1
  226.         or.l        d0,d1                * PCM kind = 8/16bitPCM
  227.         moveq.l        #$04,d0
  228.         bra        2f
  229.  
  230. 1:        move.b        fe_frq-fe_pan(a0,d7.w),d0
  231. 2:        move.b        d0,fe_frq-fe_pan(a0,d7.w)
  232.         lsl.w        #8,d0
  233.         andi.w        #$00ff,d1
  234.         or.w        d0,d1
  235.  
  236.  
  237.         move.w        d7,d0
  238.         andi.w        #$000f,d0
  239.         ori.w        #$1000,d0
  240.  
  241.         trap        #1
  242.  
  243.         moveq.l        #0,d0
  244.         rts
  245.  
  246. func_stop_eff_emu:
  247.         move.w        d7,d0
  248.         andi.w        #$000f,d0
  249.         ori.w        #$1300,d0
  250.         trap        #1
  251.         moveq.l        #0,d0
  252.         rts
  253.  
  254.  
  255. fe_pan:        .ds.b        16
  256. fe_frq:        .ds.b        16
  257. fe_vol:        .ds.b        16
  258.  
  259. *=======================================================
  260. *    機能コード $01FE のエミュレーション
  261. *=======================================================
  262.  
  263. func_01FE:    tas.b        p8emu_lock-p8w(a6)
  264.         bne        @f
  265.         moveq.l        #0,d0
  266.         rts
  267. @@:        moveq.l        #-1,d0
  268.         rts
  269.  
  270. *=======================================================
  271. *    機能コード $01FF のエミュレーション
  272. *=======================================================
  273.  
  274. func_01FF:    tst.b        p8emu_lock-p8w(a6)
  275.         bne        @f
  276.         moveq.l        #-1,d0
  277.         rts
  278. @@:        clr.b        p8emu_lock-p8w(a6)
  279.         moveq.l        #0,d0
  280.         rts
  281.  
  282. *▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽
  283. *
  284. *        非常駐部分
  285. *
  286. *△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△
  287.  
  288.         .text
  289.  
  290. p8emu_start:    pea.l        title_mes(pc)
  291.         DOS        _PRINT
  292.         addq.l        #4,sp
  293.         movea.l        a0,a6            * a0/a6=メモリ管理ポインタ
  294.         bsr        option_check
  295.  
  296. keep_check:    movea.l        (a6),a6
  297.         cmpa.l        #$10000,a6
  298.         bcs        not_keeped        * 常駐してない
  299.         lea.l        $100(a6),a5
  300.         move.l        (a5),d1
  301.         cmp.l        header,d1
  302.         bne        keep_check        * ヘッダが一致しない
  303.         move.l        4(a5),d1
  304.         cmp.l        header+4,d1
  305.         bne        keep_check        * ヘッダが一致しない
  306.         bra        keeped            * 常駐していた
  307.  
  308.  
  309. *        << 常駐していなかった場合 >>
  310.  
  311. not_keeped:    btst.b        #0,option_flag(pc)    * -r check
  312.         bne        error0            * 常駐してないのに常駐解除は出来ない
  313.  
  314.         clr.b        emumode            * CHエミュレーション=0 (default)
  315.         clr.b        lockmode        * 常駐解除チェックは行う
  316.  
  317.         btst.b        #1,option_flag(pc)    * -e check
  318.         beq        @f
  319.         st.b        emumode            * CHエミュレーション=$ff (effect)
  320. @@:        btst.b        #2,option_flag(pc)    * -x check
  321.         beq        @f
  322.         move.b        #01,emumode        * CHエミュレーション=$01 (effect nonbusy)
  323.  
  324. @@:
  325.  
  326. *        TRAP 2割り込みベクタのフック
  327.  
  328.         clr.l        -(sp)
  329.         DOS        _SUPER
  330.         move.l        d0,(sp)
  331.  
  332.         move.l        $0084.w,a0        * MPCMの常駐チェック
  333.         move.l        -8(a0),d0
  334.         cmpi.l        #'MPCM',d0
  335.         beq        @f            * 常駐していた
  336.  
  337.         DOS        _SUPER
  338.         addq.l        #4,sp
  339.         bra        error2            * MPCMがいないエラー
  340.  
  341. @@:        lea.l        p8emu_lock_name(pc),a1
  342.         move.w        #$8000,d0
  343.         trap        #1            * MPCM占有
  344.         tst.l        d0
  345.         bpl        @f
  346.  
  347.         DOS        _SUPER
  348.         addq.l        #4,sp
  349.         bra        error3            * MPCMが占有できないエラー
  350.  
  351. @@:        move.w        #$8002,d0
  352.         trap        #1            * MPCM初期化
  353.         move.w        #$8005,d0
  354.         move.l        #0,d1
  355.         trap        #1            * MPCM音量テーブルセレクト
  356.  
  357.         move.l        $0088.w,trap2_vec_buff    * trap2ベクタのフック
  358.         move.l        #p8emu_trap2,$0088.w
  359.         DOS        _SUPER
  360.         addq.l        #4,sp
  361.  
  362.         pea.l        keep_mes(pc)
  363.         DOS        _PRINT
  364.         addq.l        #4,sp
  365.  
  366.         clr.w        -(sp)
  367.         lea.l        p8emu_start(pc),a0    * コンパイル時の為
  368.         lea.l        header,a1
  369.         suba.l        a1,a0
  370.         move.l        a0,-(sp)
  371.         DOS        _KEEPPR            * 常駐して終了
  372.  
  373. *        << 既に常駐していた場合 >>
  374.  
  375. keeped:        btst.b        #0,option_flag(pc)    * r オプションが指定されている?
  376.         beq        error1            * '既に常駐'メッセージ
  377.  
  378.         btst.b        #3,option_flag(pc)    * l オプションが指定されている?
  379.         bne        @f            * 占有を考慮しない!
  380.  
  381.         tst.b        p8emu_lock-header(a5)
  382.         bne        error5            * p8emuが占有されてまんがな
  383.  
  384. @@:        lea.l        p8emu_lock_name(pc),a1
  385.         move.w        #$8001,d0
  386.         trap        #1            * MPCM 占有解除
  387.         tst.l        d0
  388.         bmi        error4            * 占有解除できない
  389.  
  390.         clr.l        -(sp)
  391.         DOS        _SUPER
  392.         move.l        d0,(sp)
  393.         move.w        sr,d0            * sr 保存
  394.         ori.w        #$0700,sr        * 割り込み禁止
  395.         move.l        trap2_vec_buff-header(a5),$0088.w    * trap 2 ベクタ戻す
  396.         DOS        _SUPER
  397.         addq.l        #4,sp
  398.  
  399.         pea.l        $10(a6)
  400.         DOS        _MFREE
  401.         pea.l        free_mes(pc)
  402.         DOS        _PRINT
  403.         addq.l        #8,sp
  404.         DOS        _EXIT            * 常駐解除終了
  405.  
  406. *=======================================================
  407. * option_check    : オプション判定&フラグとワークのセット
  408. * call        : (a2)~=コマンドライン
  409. * return    : (opt_flag)とそれぞれのワークに値をセット
  410. * breaks    : d0,d1,a2
  411. *=======================================================
  412. option_check:    addq.l        #1,a2
  413. opt_chk0:    move.b        (a2)+,d0
  414.         tst.b        d0
  415.         beq        opt_ret
  416.         cmpi.b        #'/',d0            * option ?
  417.         beq        opt_chk1
  418.         cmpi.b        #'-',d0            * option ?
  419.         beq        opt_chk1
  420.         cmpi.b        #TAB,d0            * TAB    ?
  421.         beq        opt_chk0
  422.         cmpi.b        #' ',d0            * SPACE ?
  423.         beq        opt_chk0
  424.         bra        usage            * 使用法表示
  425.  
  426. opt_chk1:    move.b        (a2)+,d0
  427.         andi.b        #$df,d0            * 大文字に揃える
  428.  
  429.         cmpi.b        #'R',d0            * r = 常駐解除
  430.         bne        @f
  431.         or.b        #$01,option_flag    * bit0 = r 用フラグ
  432.         bra        opt_chk0
  433.  
  434. @@:        cmpi.b        #'E',d0            * e = 効果音CH利用
  435.         bne        @f
  436.         or.b        #$02,option_flag    * bit1 = e 用フラグ
  437.         bra        opt_chk0
  438.  
  439. @@:        cmpi.b        #'L',d0            * l = 常駐チェック飛ばし
  440.         bne        @f
  441.         or.b        #$08,option_flag    * bit3 = l 用フラグ
  442.         bra        opt_chk0
  443.  
  444. @@:        bra        usage            * 使用法表示
  445.  
  446. opt_ret:    rts
  447.  
  448. *===============================================================
  449. * error        : 非常駐部分エラー処理
  450. * usage        : 使い方表示
  451. *===============================================================
  452. error0:        pea.l        error0_mes(pc)
  453.         bra        error
  454. error1:        pea.l        error1_mes(pc)
  455.         bra        error
  456. error2:        pea.l        error2_mes(pc)
  457.         bra        error
  458. error3:        pea.l        error3_mes(pc)
  459.         bra        error
  460. error4:        pea.l        error4_mes(pc)
  461.         bra        error
  462. error5:        pea.l        error5_mes(pc)
  463.         bra        error
  464. usage:        pea.l        usage_mes(pc)
  465.         bra        error
  466.  
  467. error:        DOS        _PRINT
  468.         addq.l        #4,sp
  469.         moveq.l        #-1,d0
  470.         DOS        _EXIT2
  471.  
  472. *===============================================================
  473. *         非常駐部分固定データ
  474. *===============================================================
  475.         .data
  476.  
  477. title_mes:    .dc.b        'PCM8 emulator version 0.20 for MPCM '
  478.         .dc.b        'copyright (c) 1994,95,96 by wachoman',CR,LF,0
  479.  
  480. keep_mes:    .dc.b        '常駐しました',CR,LF,0
  481. free_mes:    .dc.b        '常駐解除しました',CR,LF,0
  482.  
  483. error0_mes:    .dc.b        '常駐していません',CR,LF,0
  484. error1_mes:    .dc.b        '既に常駐しています',CR,LF,0
  485. error2_mes:    .dc.b        'MPCMが常駐していません',CR,LF,0
  486. error3_mes:    .dc.b        'MPCMを既に占有しているアプリケーションがあります.常駐できません',CR,LF,0
  487. error4_mes:    .dc.b        'MPCMの占有解除に失敗しました.常駐解除できません',CR,LF,0
  488. error5_mes:    .dc.b        'p8emu.xが占有されています.常駐解除できません',CR,LF,0
  489.  
  490. usage_mes:    .dc.b        'usage  :  p8emu.x [option]',CR,LF
  491.         .dc.b        'option :  /r ・・・・・・・・・ 常駐解除',CR,LF
  492.         .dc.b        '          /e ・・・・・・・・・ 効果音CHでエミュレーション',CR,LF
  493.         .dc.b        '          /l ・・・・・・・・・ p8emuの常駐解除チェックをしない(-rと組み合わせて指定してください)',CR,LF
  494.         .dc.b        0
  495.  
  496. p8emu_lock_name:.dc.b        'PCM8 emulator P8emu.x ver 0.20',0
  497.  
  498. *===============================================================
  499. *         非常駐部分ワークエリア
  500. *===============================================================
  501.         .bss
  502.  
  503. option_flag:    .ds.b        1            * bit 0 : -r option
  504.  
  505.         .end        p8emu_start
  506.  
  507.